NestJS 项目核心
项目目录结构
shell
src/
├── modules/
│ ├── auth/ # 认证模块(JWT、登录)
│ ├── user/ # 用户模块(用户-角色关联)
│ ├── role/ # 角色模块(角色-权限关联)
│ └── permission/ # 权限模块(权限定义)
├── common/
│ ├── decorators/ # 自定义装饰器(@RequireRoles/@RequirePermissions)
│ ├── guards/ # 权限守卫(RBACGuard)
│ ├── pipes/ # 全局校验管道
│ └── filters/ # 异常过滤器(处理校验错误)
├── config/ # 数据库/JWT 配置
└── app.module.ts依赖
shell
# 核心依赖
npm i @nestjs/typeorm typeorm mysql2 # 数据库(也可替换为 pg/mongodb)
npm i class-validator class-transformer # DTO 校验核心
npm i @nestjs/jwt bcryptjs # JWT 认证 + 密码加密
npm i @nestjs/passport passport-jwt # 可选:Passport 集成(简化 JWT 校验)
npm i reflect-metadata # 元数据(装饰器必备)TODO
- 目录规范
- JWT 校验需要重构,不使用官网提供的方式,不好理解
- 参数命名规范,使用 param body req 怎么选择 RESTful 规范建议: 资源的唯一标识(ID)优先放在 param 中(符合 REST 设计原则),而非 body。 仅传递「业务数据」时用 body,仅传递「资源定位信息」时用 param。
注意
- 后台系统的注册接口:正常的后台是没有注册功能的,而新用户是在用户管理模块需要通过创建用户接口来创建,如果非要做注册接口,可以在注册接口中注册后默认赋予普通用户的权限
- 修改使用 PUT 还是 PATCH
shell
维度 PUT 方法 PATCH 方法
更新粒度 全量更新(替换整个资源) 部分更新(仅修改指定字段)
入参要求 必须传递资源的所有必填字段(即使未修改) 仅传递需要修改的字段
幂等性 幂等(多次调用结果一致) 幂等(RESTful 推荐,实现需保证)
语义 “替换” 资源(若不存在可创建) “修改” 资源的部分属性- 在 service 中定义逻辑,尽量不要引用其他方法的逻辑,否则有改动后其他逻辑也会携带变更
- 各个模块可以共享 Repository,Service ,推荐优先使用 Repository,尽量不要使用 service 否则改动后会相互影响
关于依赖注入的导出和导入
注意:如果导入的模块中还导入了其他模块,那么在本模块中也需要额外再导入其他关联模块
跨模块使用 Repository
把 userRepository 导入到 role.service.ts 中使用
shell
# 第一步:在 user.module.ts 中导出
exports: [TypeOrmModule.forFeature([User])],
# 第二步:在 role.module.ts 中导入
imports: [TypeOrmModule.forFeature([Role, User])],
# 第三步:在 role.service.ts 中使用
@InjectRepository(User) private readonly userRepository: Repository<User>跨模块使用 Service
一个道理,导入导出 service 即可
